#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>


void handler(int signo)
{
    std::cout<<"我已经解除屏蔽"<<signo<<std::endl;
}

int main()
{
    signal(2,handler);
    //初始化，把指定的位图全部清0
    sigset_t block,oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    //设置信号,此时我们有没有把对2号信号的屏蔽，设置进入内核中？：只是在用户栈上设置了block的位图结构
    // 并没有设置进入内核中！
    sigaddset(&block,2);

    //把我们对2号信号的屏蔽，设置进入内核中
    sigprocmask(SIG_SETMASK,&block,&oblock);
    int count=0;
    while(true)
    {
        //获取该进程的pending表并打印
        sigset_t pending;
        sigpending(&pending);

        std::cout<<getpid()<<":";
        for(int i=31;i>0;i--)
        {
            if(sigismember(&pending,i))//挨个挨个检查是否存在在该位图里
            {
                std::cout<<"1";
            }
            else
            {
                std::cout<<"0";
            }
        }
        std::cout<<std::endl;
        count++;
        if(count>=10)
        {
            sigprocmask(SIG_SETMASK, &oblock, nullptr);//解除屏蔽
        }
        sleep(1);
    }

    return 0;
}

// int main()
// {
//     ::signal(2,SIG_IGN);//ignore 忽略：本身就是一种处理方法，什么也不用做直接忽略掉
//     ::signal(2,SIG_DFL);//default:执行该信号默认的处理方法
//     return 0;
// }